利用 AWS System Manager 来连 VPC 内网的资源

环境

配置好的 EC2

VPC 内需要有一台 EC2(有无公网 IP 好像没关系),并做好相关配置

安装 SSM Agent

Amazon Linux(无论是 1,还是 2,或者是 2023) 一般是预装好的,只需要确认是否正常启动:

1
2
3
4
sudo systemctl status amazon-ssm-agent
# 如果没有启动的话,设置为自启动,并启动
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent

如果系统没有安装过 SSM Agent,那么安装(以 CentOS 8 为例):

1
2
sudo dnf install -y \
https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

激活“默认主机管理配置”

  1. 访问 https://console.aws.amazon.com/systems-manager/,打开 AWS Systems Manager 控制台。
  2. 在导航窗格中,选择 Fleet Manager。或者如果首先打开 AWS Systems Manager 主页,选择菜单图标 (  The menu icon) 以打开导航窗格,然后在导航窗格中选择 Fleet Manager
  3. 账户管理下拉列表中选择默认主机管理配置
  4. 打开启用默认主机管理配置
  5. 选择用于为您的实例启用 Systems Manager 功能的 AWS Identity and Access Management(IAM)角色。我们建议使用“默认主机管理配置”提供的默认角色。它包含使用 Systems Manager 管理您的 Amazon EC2 实例所需的最低权限集合。如果您更喜欢使用自定义角色,则该角色的信任策略必须允许 Systems Manager 作为可信实体。
  6. 选择配置以完成设置。

注意:

在打开“默认主机管理配置”后,您的实例可能需要最长 30 分钟才能使用所选角色的凭证。您必须在要自动管理 Amazon EC2 实例的每个区域中打开“默认主机管理配置”。

如不做其他调整,最多 30 分钟以后,你会在 System Manager -> Fleet Manager -> Managed nodes 下看到你的 EC2 了

本地 aws-cli 和 Session Manager plugin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 我的本地环境是 Macbook Air (m1),
# 其他环境可能命令不一样
curl \
"https://awscli.amazonaws.com/AWSCLIV2.pkg" \
-o "AWSCLIV2.pkg"
sudo installer \
-pkg AWSCLIV2.pkg \
-target /
# 以上命令是安装 aws-cli。
# 然后当然还需要配置 aws --configure
# 或 aws --profile xxx --configure
curl \
"https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac_arm64/session-manager-plugin.pkg" \
-o "session-manager-plugin.pkg"
sudo installer \
-pkg session-manager-plugin.pkg \
-target /
sudo ln \
-s /usr/local/sessionmanagerplugin/bin/session-manager-plugin \
/usr/local/bin/session-manager-plugin

具体使用

场景一:登录服务器

1
2
3
4
aws --profile test \
ssm start-session \
--target i-xxxxxxxxxxxxxxxxxx
# "i-xxxxxxxxxxxxxxxxxx" 是这台 EC2 的 ID

场景二:打洞到 RDS

1
2
3
4
5
6
7
aws --profile test \
ssm start-session \
--target i-xxxxxxxxxxxxxxxxxx \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters 、
host="10.0.0.1",portNumber="3306",localPortNumber="5555"
# 这里的 “10.0.0.1” 是你要连的 MySQL 的 IP 地址,是假设的,得根据实际情况修改

然后就可以愉快的在本地连数据库了:

1
mysql -h 127.0.0.1 -P 5555 -U admin -p